export function mergeOptions(parent = {}, child = {}) {
  const options = {};
  const strats = {}; //策略对象

  const lifecycle = [
    "beforeCreate",
    "created",
    //...
  ];
  //策略模式
  lifecycle.forEach((lifec) => {
    strats[lifec] = function (p, c) {
      if (c) {
        if (p) {
          return p.concat(c);
        } else {
          return [c];
        }
      } else {
        return p;
      }
    };
  });
  for (const key in parent) {
    mergeField(key);
  }
  for (const key in child) {
    if (!parent.hasOwnProperty(key)) {
      mergeField(key);
    }
  }

  function mergeField(key) {
    if (strats[key]) {
      options[key] = strats[key](parent[key], child[key]); //如果有策略，则使用策略模式合并
    } else {
      options[key] = child[key] || parent[key]; //优先使用儿子 ，再使用父亲的，相当于就是优先使用子组件实例上的，在考虑全局的
    }
  }
  return options;
}
